package com.tledu.springboot19.spider;

import org.springframework.stereotype.Component;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.util.HashMap;
import java.util.Map;

@Component
public class XLNewsPageProcessor implements PageProcessor {

    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000).setTimeOut(10000);

    @Override
    public void process(Page page) {
        // 区分列表界面和详情界面
        // 判断id="d_list" 的元素不为空的时候就是列表界面
        // 判断是不是请求列表的方式就变了，获取json格式的数据了，需要通过json操作来获取对应的数据
        Integer pageNum = (Integer) page.getRequest().getExtra("pageNum");
        // 所有的json数据的连接
        // 当前的请求是列表请求还是详情界面
        if (pageNum != null) {
            // 列表界面
            // 1. 添加详情界面的链接
            page.addTargetRequests(page.getJson().jsonPath("result.data[*].url").all());
            // 2. 添加下一个列表界面
            //      请求携带的额外数据,这个数据可以自定义,我们可以手动为所有的请求设置一些额外的数据
            //      这些额外数据的作用就是，方便在每次请求的过程中传递一些信息
            // 获取了当前的页码

            if (pageNum < 100) {
                // 构建一个新的请求
                Request request = new Request();
                request.setUrl("https://feed.mix.sina.com.cn/api/roll/get?pageid=153&lid=2509&k=&num=50&r=0.7528406726388162&page=" + (pageNum + 1));
                // 设置当前的页码
                Map<String, Object> map = new HashMap<>();
                map.put("pageNum", pageNum + 1);
                // 把这个页码添加到Request里面
                request.setExtras(map);
                // 将request添加到调度器中
                page.addTargetRequest(request);
            }
            page.setSkip(true);
        } else {
            // 详情界面
            ResultItems resultItems = page.getResultItems();
            String title = page.getHtml().xpath("//h1[@class='main-title']/text()").get();
            if (title == null || "".equals(title)) {
                page.setSkip(true);
            }
            resultItems.put("title", title);
            resultItems.put("sendTime", page.getHtml().xpath("//div[@id='top_bar']//span[@class='date']/text()").get());
            resultItems.put("category", page.getHtml().xpath("//div[@id='top_bar']//div[@class='date-source']/*[@class='source']/text()").get());
            Selectable artibodySelectable = page.getHtml().xpath("//div[@id='artibody']");
            Selectable articleSelectable = page.getHtml().xpath("//div[@id='article']");
            Selectable content = null;
            // 文章没有内容
            if (artibodySelectable == null && articleSelectable == null) {
                // 如果两个都是null代表没有内容
                page.setSkip(true);
            } else if (artibodySelectable != null) {
                // 如果artibodySelectable == null
                content = artibodySelectable;
            } else {
                content = articleSelectable;
            }
            if (content != null) {
                resultItems.put("content", content.smartContent().get());
                // 富文本内容，带标签的文本内容
                resultItems.put("contentHtml",content.get());
            }

        }
    }

    @Override
    public Site getSite() {
        return site;
    }
}
